package role_api

import (
	"benkendSystem/database"
	"benkendSystem/models"
	"benkendSystem/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"net/http"
)

// AddRole 添加角色
func AddRole(c *gin.Context) {
	in := new(AddRoleRequest)
	err := c.ShouldBindJSON(in)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 500,
			"msg":  "系统错误",
		})
		return
	}
	// 判断角色是否存在
	var cnt int64
	err = database.DB.Model(new(models.Role)).Where("name = ?", in.Name).Count(&cnt).Error
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 500,
			"msg":  "系统异常",
		})
		return
	}
	if cnt > 0 {
		c.JSON(http.StatusOK, gin.H{
			"code": 500,
			"msg":  "角色名已存在",
		})
		return
	}
	// 给角色授权菜单
	rms := make([]*models.RoleMenu, len(in.MenuId))
	for i, _ := range rms {
		rms[i] = &models.RoleMenu{
			MenuId: int64(in.MenuId[i]),
		}
	}
	// 插入初始化id
	err = utils.InitSnowflake(1)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 500,
			"msg":  "系统错误",
		})
		return
	}
	id := utils.GenerateID()

	// 组成角色数据
	rb := &models.Role{
		ID:      id,
		Name:    in.Name,
		Sort:    in.Sort,
		IsAdmin: in.IsAdmin,
	}

	//  新增角色
	err = database.DB.Transaction(func(tx *gorm.DB) error {
		// 保存角色
		err := tx.Create(rb).Error
		if err != nil {
			return err
		}
		// 保存菜单
		for _, v := range rms {
			v.RoleId = rb.ID
		}
		if len(rms) > 0 {
			err = tx.Create(rb).Error
			if err != nil {
				return err
			}
		}
		return nil
	})
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 500,
			"msg":  "系统错误",
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "操作成功",
	})

}
